package com.rx.core.enm;

import com.rx.core.iface.InputMode;
import com.rx.core.util.RxUtil;

/**
 * 所有版权归 广西梧州 陈锦韬 所有
 *
 * @version V1.0
 * @Title: RX_DB_OPERATE
 * @Package com.rx.core.enm
 * @Description: 数据库操作
 * @author: 陈锦韬
 * @date: 2021/6/16
 * @Copyright: 2021 陈锦韬  All rights reserved.
 */
public enum RX_DB_OPERATE {
    /**
     * in 操作
     */
    IN("in_"),
    /**
     * 大于
     */
    GT("gt_"),
    /**
     * 小于
     */
    LT("lt_"),
    /**
     * 大于或等于
     */
    GE("ge_"),
    /**
     * 小于或等于
     */
    LE("le_"),
    /**
     * 非空
     */
    IS_NOT_NULL("is_not_null_"),
    /**
     * 空
     */
    IS_NULL("is_null_"),
    /**
     * 模糊查询
     */
    LIKE("like_"),
    /**
     * 左模糊 **%
     */
    LIKE_LEFT("like_left_"),
    /**
     * 右模糊
     */
    LIKE_RIGHT("like_right_"),
    /**
     * 不在
     */
    NOT_IN("not_in_"),
    /**
     * 不等于
     */
    NE("ne_"),
    /**
     * 等于
     */
    EQ("eq_"),

    /// sql片段
    SQL("sql"),
    /// 聚合函数
    SUM("sum(IFNULL(#{},0)) as #{}"),
    COUNT("count(#{}) as #{}"),
    AVG("avg(IFNULL(#{},0)) as #{}"),
    MAX("max(#{}) as #{}"),
    MIN("min(#{}) as #{}"),
    GROUP("groupby"),
    ;
    String value;

    RX_DB_OPERATE(String value) {
        this.value = value;
    }

    public String getValue(){
        return RxUtil.StringUtil.lineToHump(value);
    }

    public boolean startAt(String key){
        String underLine = RxUtil.StringUtil.humpToLine(key).toLowerCase();
        if (this == LIKE){
            boolean left = underLine.startsWith(LIKE_LEFT.value);
            boolean right = underLine.startsWith(LIKE_RIGHT.value);
            return !left&&!right&&underLine.startsWith(this.value);
        }
        return underLine.startsWith(this.value);
    }
    public boolean startWith(String val){
        String hump = RxUtil.StringUtil.lineToHump(value);
        return hump.startsWith(val);
    }
    public String getName(String key){
        String hump = RxUtil.StringUtil.lineToHump(value);
        return key.substring(hump.length());
    }

    public int assignQueryWrapper(String key, InputMode inputMode){
        if(startAt(key)){
            inputMode.handle(RxUtil.StringUtil.firstUpperHumpToLine(getName(key)));
            return 1;
        }
        return 0;
    }
    public String getSql(String name,String value){
        if (startWith(name.trim())){
            if (GROUP.equals(this)){
                return RxUtil.StringUtil.humpToLine(value.trim()) + ",";
            }
            return this.value.replace("#{}",RxUtil.StringUtil.humpToLine(value.trim())) + ",";
        }
        return "";
    }

}
